# tool/gif.py

"""
- GIF去除背景：
    - 网上工具
    - 人工制作：提取帧、每帧消除背景、重新组织为gif(curr)
"""

import requests
from PIL import Image
import os
from ..config.apikey import REMOVEBG_APIKEY
def extract_frames_from_gif(gif_path, output_dir):
    """
    从GIF中提取每一帧并保存为独立的图像文件。

    :param gif_path: GIF文件的路径
    :param output_dir: 提取帧的保存目录
    """
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
    gif_name = os.path.split(os.path.basename(gif_path))[0]
    with Image.open(gif_path) as img:
        frame_number = 0
        try:
            while True:
                # 保存当前帧
                frame_path = f"{output_dir}/{gif_name}_{frame_number}.png"
                img.save(frame_path)
                print(f"Saved frame {frame_number} to {frame_path}")

                # 移动到下一帧
                frame_number += 1
                img.seek(img.tell() + 1)
        except EOFError:
            # GIF处理完成
            pass

def remove_background(frame_path, output_path):
    """
    去除图像的纯色背景。

    :param frame_path: 输入图像路径
    :param output_path: 输出图像路径
    :param bg_color: 背景颜色
    """
    # Requires "requests" to be installed (see python-requests.org)

    response = requests.post(
        'https://api.remove.bg/v1.0/removebg',
        files={'image_file': open(frame_path, 'rb')},
        data={'size': 'auto'},
        headers={'X-Api-Key': REMOVEBG_APIKEY},
    )
    if response.status_code == requests.codes.ok:
        with open(output_path, 'wb') as out:
            out.write(response.content)
    else:
        print("Error:", response.status_code, response.text)
    
    
def images_to_gif(image_paths, output_path, duration=500):
    """
    将图像列表转换为GIF。
    :param image_paths: 图像路径列表
    :param output_path: 输出GIF路径
    :param duration: 每帧持续时间（毫秒）
    """
    # 读取所有图片
    images = [Image.open(file).convert('RGBA') for file in image_paths]

    # 将所有图片转换为相同的尺寸，这里假设所有图片都已经尺寸一致
    # 如果不一致，你可以选择一个基准尺寸并使用 Image.resize() 方法来调整它们
    # 例如：基准尺寸为 (300, 300)
    # for i, img in enumerate(images):
    #     images[i] = img.resize((300, 300), Image.ANTIALIAS)

    # 创建一个透明的帧列表
    frames = [Image.new('RGBA', img.size, (255, 255, 255, 0)) for img in images]

    # 将每个图片合并到对应的透明帧上
    for frame, img in zip(frames, images):
        frame.paste(img, (0, 0), img)

    # 设置每帧的持续时间（单位：毫秒）
    duration_per_frame = 200

    # 保存为GIF文件
    frames[0].save(output_path, save_all=True, append_images=frames[1:], optimize=False, duration=duration_per_frame, loop=0)